"""
进程 VS 线程

实现多任务最常用的两种方式:
    1.进程
    2.线程

实现多任务常用的设计模式：
    1.Master-Worker模式（Master负责分配任务，Worker负责执行任务）

多进程模式的最大优点：稳定性高
多进程模式的缺点：创建进程的代价大（开销大、系统同时运行的进程数有限，在内存和CPU的先知先，如果有几千个进程同时运行，操作系统连调度都会成问题）

多线程模式的优点：通常比多进程快一点（在Windows下，多线程的效率比多进程高）
多线程模式的致命缺点：任何一个线程挂掉可能造成整个进程崩溃，因为所有线程共享进程的内存。

IIS和Apache的做法：使用多进程+多线程的混合模式。

线程切换的问题：
    线程切换是需要付出代价的，多任务一旦多到一个限度，就会消耗掉系统所有的资源，结果效率急剧下降。

任务的类型：
    1.计算密集型
    2.IO密集型

计算密集型任务：
    计算密集型任务的特点是要进行大量的计算，消耗CPU资源。
    要最高效的利用CPU，计算密集型任务同时进行的数量应当等于CPU的核心数【尽可能降低任务切换的成本】。
    计算密集型任务最好使用更底层的语言实现，比如C语言。

IO密集型任务：
    涉及到网络、磁盘IO的任务都是IO密集型任务（如Web应用）。
    IO密集型任务的特点是CPU消耗很少，任务的大部分时间都在等待IO操作完成（因为IO的速度远远低于CPU和内存的速度）。
    IO密集型任务最好使用开发效率高（代码量少）的语言，比如python语言。

异步IO：
    1.考虑到CPU和IO之间巨大的速度差异，一个任务在执行的过程中大部分时间都在等待IO操作，
      单进程单线程模型会导致别的任务无法并行执行，因此，我们才需要多进程模型或者多线程模型来支持多任务并发执行。
    2.现代操作系统对IO操作已经做了巨大的改进，最大的特点就是支持异步IO。
      如果充分利用操作系统提供的异步IO支持，就可以用单进程单线程模型来执行多任务，这种全新的模型称为事件驱动模型，
      Nginx就是支持异步IO的Web服务器，它在单核CPU上采用单进程模型就可以高效地支持多任务。
      在多核CPU上，可以运行多个进程（数量与CPU核心数相同），充分利用多核CPU。
      由于系统总的进程数量十分有限，因此操作系统调度非常高效。用异步IO编程模型来实现多任务是一个主要的趋势。
    3.对应到Python语言，单线程的异步编程模型称为协程，有了协程的支持，就可以基于事件驱动编写高效的多任务程序。
"""